const arr = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5, "string", { name: "弹铁蛋同学" }];
// // concat + 递归
// function flat1(arr) {
//   let arrResult = [];
//   arr.forEach(item => {
//     if (Array.isArray(item)) {
//       arrResult = arrResult.concat(arguments.callee(item));   // 递归
//       // 或者用扩展运算符
//       console.log('p', arguments.callee(item))
//       // arrResult.push(...arguments.callee(item));
//     } else {
//       arrResult.push(item);
//     }
//   });
//   return arrResult;
// }
// flat1(arr)


// 首先使用 reduce 展开一层
let h = arr.reduce((pre, cur) => pre.concat(cur), []);
console.log(h)

// 用 reduce 展开一层 + 递归
const flat2 = arr => {
  return arr.reduce((pre, cur) => {
    return pre.concat(Array.isArray(cur) ? flat2(cur) : cur);
  }, []);
};

// reduce + 递归
function flat3(arr, num = 1) {
  return num > 0
    ? arr.reduce(
      (pre, cur) =>
        pre.concat(Array.isArray(cur) ? flat3(cur, num - 1) : cur),
      []
    )
    : arr.slice();
}
flat3(arr, Infinity);
